package com.qf.controller;

import com.qf.annotation.NoLogin;
import com.qf.common.PageVO;
import com.qf.param.DTO.ProductAddDTO;
import com.qf.param.DTO.ProductListPageDTO;
import com.qf.param.DTO.ProductUpdateDTO;
import com.qf.param.VO.ProductListPageVO;
import com.qf.util.R;
import com.qf.service.ProductService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;

/**
 * @Author Ayases
 * @Date 2025/6/9 15:19
 * @Desc
 */
@Validated // 启用参数校验
@RestController
@RequestMapping("/product")
public class ProductController {

    @Resource
    ProductService productService;

    //测试时添加注解@NoLogin，避免被登录拦截

    /**
     * 用户端：查询获取菜单列表商品分页信息
     *
     * @param productListPageDTO（分页信息）
     * @return R
     */
    @NoLogin
    @GetMapping("/pageInfo")
    public R pageInfo(ProductListPageDTO productListPageDTO) {
        PageVO<ProductListPageVO> pageVO = productService.productPageInfo(productListPageDTO);
        return R.ok(pageVO);
    }

    /**
     * 用户端：查询获取单个商品详情信息
     *
     * @param id（商品id）
     * @return R
     * 测试用id（商品id）:550e8400-e29b-41d4-a716-446655440000
     */
    @NoLogin
    @GetMapping("/getProductInfo")
    public R getProductInfo(String id) {
        return R.ok(productService.getProductInfo(id));
    }

    /**
     * 后台端：添加商品
     * 技术 1：minio上传图片（所有图片之和不能超过20MB）
     * 技术 2：使用hibernate-validator校验参数是否合法
     * 测试：使用form-data（可以传图片）
     *(测试中的问题，图片上传大小有限制，在yml中改配置)
     *
     */
    //ProductAddDTO中有multipartFile数组,使用注解ModelAttribute绑定参数，必须使用Post接收
    @NoLogin
    @PostMapping("/addProduct") // 必须使用 POST 方法
    public R addProduct(@Valid @ModelAttribute ProductAddDTO productAddDTO) {
        productService.addProduct(productAddDTO);
        return R.ok();
    }

    /**
     * 后台端：修改商品
     * 技术 1：minio上传图片（所有图片之和不能超过20MB）
     * 技术 2：使用hibernate-validator校验参数是否合法
     * 测试：使用form-data（可以传图片）
     *
     * 注意：
     * 1. 支持部分字段更新（非空字段才更新）
     * 2. 图片处理策略：(minio和数据库url字段都会相应地更新)
     *    - 上传新图片：删除旧图片，保存新图片
     *    - 空数组：删除所有旧图片
     *    - null：保留原有图片不变
     * 3. 自动更新updatedAt时间戳
     * 4. 事务管理确保数据一致性
     *
     * 测试方式：使用form-data格式（支持文件上传）
     * 测试用例：770e8400-e29b-41d4-a716-446655440000
     */
    @NoLogin
    @PostMapping("/updateProduct")
    public R updateProduct(@Valid @ModelAttribute ProductUpdateDTO updateDTO) {
        productService.updateProduct(updateDTO);
        return R.ok();
    }


    /**
     * 后台端：删除商品
     * 删除商品表，商品评价表，评价点赞表中相关数据（物理删除）
     * 同时删除在minio中的图片（物理删除）
     */
    @NoLogin
    @GetMapping("/deleteProduct")
    public R deleteProduct(String id) {
        productService.deleteProduct(id);
        return R.ok();
    }

    /**
     * 后台端：设置商品上下架（可以设置执行时间）
     * 前端传过来商品上下架的时间，后端到时间执行相应操作
     * 如何上下架商品？定时修改商品上下架状态，当前端刷新商品列表时，根据上下架状态显示商品
     *
     * 定时任务：
     * 方案1：使用xxljob直接动态添加定时任务（使用这个）
     * 方案2：将定时的时间写到数据库，使用springTask定时轮询数据库，到时间执行相应操作
     * （方案2的问题：1集群环境问题,需要额外加分布式锁；2执行时间不一致，存在时间差）
     *  使用xxljob方案时，数据库添加定时任务表，记录定时时间和即将执行的操作，方便后端管理查看
     *  执行完操作后，标记任务状态为已完成
     */


}
